textlayout: Render cursors at the end
authorMatthias Clasen <mclasen@redhat.com>
Sat, 13 Mar 2021 00:28:36 +0000 (19:28 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 13 Mar 2021 00:28:36 +0000 (19:28 -0500)
Don't place the insertion cursor render nodes in the
middle of the text nodes for all the text. This helps
the renderer batching the text draw calls together.

gtk/gtktextlayout.c

index 9c994137aeab480a8f1ed573ae6ef7f28a43e2af..358a92e51743f1deba269e048084cc9110bbd122 100644 (file)
@@ -4142,6 +4142,8 @@ gtk_text_layout_snapshot (GtkTextLayout      *layout,
   GSList *line_list;
   GSList *tmp_list;
   GdkRGBA color;
+  GtkSnapshot *cursor_snapshot;
+  GskRenderNode *cursors;
 
   g_return_if_fail (GTK_IS_TEXT_LAYOUT (layout));
   g_return_if_fail (layout->default_style != NULL);
@@ -4158,6 +4160,8 @@ gtk_text_layout_snapshot (GtkTextLayout      *layout,
   if (line_list == NULL)
     return; /* nothing on the screen */
 
+  cursor_snapshot = gtk_snapshot_new ();
+
   crenderer = gsk_pango_renderer_acquire ();
 
   gsk_pango_renderer_set_shape_handler (crenderer, snapshot_shape);
@@ -4267,14 +4271,14 @@ gtk_text_layout_snapshot (GtkTextLayout      *layout,
                   dir = (line_display->direction == GTK_TEXT_DIR_RTL) ? PANGO_DIRECTION_RTL : PANGO_DIRECTION_LTR;
 
                   if (cursor.is_insert || cursor.is_selection_bound)
-                    gtk_snapshot_push_opacity (crenderer->snapshot, cursor_alpha);
+                    gtk_snapshot_push_opacity (cursor_snapshot, cursor_alpha);
 
-                  gtk_snapshot_render_insertion_cursor (crenderer->snapshot, context,
+                  gtk_snapshot_render_insertion_cursor (cursor_snapshot, context,
                                                         line_display->x_offset, offset_y + line_display->top_margin,
                                                         line_display->layout, cursor.pos, dir);
 
                   if (cursor.is_insert || cursor.is_selection_bound)
-                    gtk_snapshot_pop (crenderer->snapshot);
+                    gtk_snapshot_pop (cursor_snapshot);
                 }
             }
         } /* line_display->height > 0 */
@@ -4288,6 +4292,13 @@ gtk_text_layout_snapshot (GtkTextLayout      *layout,
 
   gtk_text_layout_wrap_loop_end (layout);
 
+  cursors = gtk_snapshot_free_to_node (cursor_snapshot);
+  if (cursors)
+    {
+      gtk_snapshot_append_node (crenderer->snapshot, cursors);
+      gsk_render_node_unref (cursors);
+    }
+
   /* Only update eviction source once per snapshot */
   gtk_text_line_display_cache_delay_eviction (priv->cache);